package main

import (
	"fmt"
	"unicode/utf8"
)

/** map 的key
	map使用哈希表,必须可以比较相等
	除了slice map func的内建类型都可以作为key
	struct类型不包含上述字段也可以作为key

	map的操作
	key不存在是获取初始值
	用value,ok := m[key]来判断是否存在key
	用delete来删除key
	map的遍历
	使用range 遍历， 不能保证顺序，使用slice保证顺序
 */
//寻找最长无重复字符串长度
func lengthOfNoRepeat(s string) int  {
	//lastOccurred := make(map[byte]int)
	lastOccurred := make(map[rune]int)  //使用rune兼容汉字
	start := 0
	maxLength := 0
	for i, ch := range []rune(s) {
		if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
			start = lastI + 1
		}
		if i - start + 1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
	}
	return maxLength
}

/**
	字符串处理
	1.使用range 遍历rune
	2.使用utf8.RuneCountInString获取字符长度
	3.使用len获取字节长度
	4.使用[]byte获取字节
 */
func strTest(s string) {
	for _, v := range []byte(s){
		fmt.Printf("%X ", v)
	}
	fmt.Println()
	for i, v1 := range s{
		fmt.Printf("(%d %x)", i, v1)
	}
	fmt.Println()
	fmt.Println("rune count", utf8.RuneCountInString(s))
	bytes := []byte(s)
	for len(bytes) > 0 {
		r, size := utf8.DecodeRune(bytes)
		bytes = bytes[size:]
		fmt.Printf("%c", r)
	}
	fmt.Println()
	for i, ch := range []rune(s) {
		fmt.Printf("%d %c", i, ch)
	}
	//for i, v := r {
	//	fmt.Println()
	//}
	//fmt.Println()
	//fmt.Println(size)

}

func main() {
	str := "yes我爱慕课网!"
	strTest(str)
	return
	str1 := "abcabcbb"
	//str2 := "bbbb"
	//str3 := "pwwkew"
	//test(str1)
	res := lengthOfNoRepeat(str1)
	fmt.Println(res)
	return

	m := map[string]string{
		"aa":"bb",
		"cc":"dd",
		"ee":"ff",
	}
	m1 := make(map[string]int)
	var m2 = make(map[string]int)

	fmt.Println("m = ", m)
	fmt.Println("m1 = ", m1)
	fmt.Println("m2 = ", m2)
	fmt.Println("traversing map")
	for k,v :=range m{
		fmt.Println(k,v)
	}
	fmt.Println("get value")
	aa := m["aa"]
	fmt.Println(aa)
	a := m["a"]
	fmt.Println(a) //当获取不存在的值时，会返回空。因为m会初始化map中的值为空
	a,ok := m["a"] //可以这样检测
	fmt.Println(a,ok)
	if a, ok := m["a"]; ok{
		fmt.Println(a)
	} else {
		fmt.Println("key is not")
	}
	println("delete key")
	delete(m, "aa")
	fmt.Println(m)
}


